module digitshow(
    input  wire        clk,        // 系统时钟（建议50MHz）
    input  wire        rst_n,      // 低有效复位
    input  wire [3:0]  data_in_1,  // 最右位 DIG0
    input  wire [3:0]  data_in_2,  // DIG1
    input  wire [3:0]  data_in_3,  // DIG2
    input  wire [3:0]  data_in_4,  // 最左位 DIG3
	input  wire [3:0]  data_vld,   // 数据有效
    output reg  [7:0]  seg,        // 段码输出 (高亮)
    output reg  [3:0]  dig         // 位选输出 (低有效)
);

    reg [1:0] sel;       // 当前扫描位
    reg [15:0] cnt;      // 分频计数器
    reg [3:0] current_data;

    //-----------------------------------------
    // 分频产生扫描时钟 (约1kHz)
    //-----------------------------------------
    always @(posedge clk or negedge rst_n) begin
    	if (!rst_n)
    	    cnt <= 16'd0;
    	else if (cnt == 16'd49999)
    	    cnt <= 16'd0;
    	else
    	    cnt <= cnt + 1'b1;
	end

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            sel <= 2'd0;
        else if (cnt == 16'd49999)    // 50MHz / 50000 = 1kHz
            sel <= sel + 1'b1;
    end

    //-----------------------------------------
    // 位选信号（低有效）
    //-----------------------------------------
    always @(*) begin
        case (sel)
            2'd0: dig = 4'b1110;  // DIG0（最右）
            2'd1: dig = 4'b1101;  // DIG1
            2'd2: dig = 4'b1011;  // DIG2
            2'd3: dig = 4'b0111;  // DIG3（最左）
            default: dig = 4'b1111;
        endcase
    end

    //-----------------------------------------
    // 当前显示的数据
    //-----------------------------------------
    always @(*) begin
        case (sel)
            2'd0: current_data = data_in_1;
            2'd1: current_data = data_in_2;
            2'd2: current_data = data_in_3;
            2'd3: current_data = data_in_4;
            default: current_data = 4'h0;
        endcase
    end

    //-----------------------------------------
    // 段码表（共阴极，高电平点亮）
    //-----------------------------------------
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            seg <= 8'b00000000;
        else if (data_vld[sel]) begin
            case (current_data)
                4'h0: seg <= 8'b00111111; // a b c d e f
                4'h1: seg <= 8'b00000110; // b c
                4'h2: seg <= 8'b01011011; // a b d e g
                4'h3: seg <= 8'b01001111; // a b c d g
                4'h4: seg <= 8'b01100110; // b c f g
                4'h5: seg <= 8'b01101101; // a c d f g
                4'h6: seg <= 8'b01111101; // a c d e f g
                4'h7: seg <= 8'b00000111; // a b c
                4'h8: seg <= 8'b01111111; // 全亮
                4'h9: seg <= 8'b01101111; // a b c d f g
                4'hA: seg <= 8'b01110111; // a b c e f g
                4'hB: seg <= 8'b01111100; // c d e f g
                4'hC: seg <= 8'b00111001; // a d e f
                4'hD: seg <= 8'b01011110; // b c d e g
                4'hE: seg <= 8'b01111001; // a d e f g
                4'hF: seg <= 8'b01110001; // a e f g
                default: seg <= 8'b00000000;
            endcase
            //seg[7] <= 1'b0; // dp（小数点）关闭
        end else if(!data_vld[sel]) begin
        	seg <= 8'b00000000; //全灭
        end
    end
    
    always @(posedge clk or negedge rst_n) begin
    	
    end

endmodule
